#ifndef TESTEIGENS_H
#define	TESTEIGENS_H

#include <cppunit/extensions/HelperMacros.h>
#include <CL/cl.h>
#include "../../LapackPlatform/Lapack.h"
#include "../../OclLapack/OclLapack.h"

class TestEigens : public CPPUNIT_NS::TestFixture {
	CPPUNIT_TEST_SUITE(TestEigens);
	
	//CPPUNIT_TEST(testKnownEigensLapack);
	//CPPUNIT_TEST(testKnownEigensCPU);
	//CPPUNIT_TEST(testKnownEigensGPU);
	
	CPPUNIT_TEST(testIntervalOfEigensLapack);
	CPPUNIT_TEST(testIntervalOfEigensCPU);
	CPPUNIT_TEST(testIntervalOfEigensGPU);
	
	//CPPUNIT_TEST(testRandomEigensLapack);
	//CPPUNIT_TEST(testRandomEigensCPU);
	//CPPUNIT_TEST(testRandomEigensGPU);
	
	CPPUNIT_TEST(compareSstebz);
	
	CPPUNIT_TEST(testKnownSstebzOnlyOnGPU);
	
	CPPUNIT_TEST_SUITE_END();

public:
	TestEigens();
	virtual ~TestEigens();
	void setUp();
	void tearDown();

private:
	static Lapack *lapack;
	static OclLapack *lapackCPU;
	static OclLapack *lapackGPU;
	
	static Lapack* getLapack();
	static Lapack* getOclLapackCPU();	
	static Lapack* getOclLapackGPU();	
	
	void testKnownEigensLapack();
	void testKnownEigensCPU();
	void testKnownEigensGPU();
	
	void testRandomEigensLapack();
	void testRandomEigensCPU();
	void testRandomEigensGPU();
	
	void testIntervalOfEigensLapack();
	void testIntervalOfEigensCPU();
	void testIntervalOfEigensGPU();
	
	void compareSstebz(int size);
	void compareSstebz();
	
	void testKnownSstebzOnlyOnGPU();
	
};

#endif	/* TESTEIGENS_H */
